package com.carsa.blackberry.domain.dto;

import java.util.Calendar;
import java.util.Date;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;

import com.carsa.blackberry.MainKeys;
import com.carsa.blackberry.util.DateUtil;
import com.carsa.blackberry.util.XMLHandler;
import com.carsa.blackberry.util.XMLPortable;
import com.carsa.blackberry.util.persistence.Persistable;

/**
 * @author Nahuel Barrios.
 * @since 03/09/2010.
 * @version 1.0
 */
public class EntregasQueueDTO implements XMLPortable, Persistable {

	private static final String XML_ELEMENT_ROOT_TAG = "drivers";
	private static final String XML_ELEMENT_PERSIST_PATH = "persistPath";
	private static final String XML_ELEMENT_ELEMENTS = "elements";
	private static final String XML_ELEMENT_LAST_OVERWRITE = "lastOverwrite";

	private Hashtable _entregas = new Hashtable();
	private String _persistPath;
	private Date _lastOverwrite;

	/**
	 * @param xmlSource
	 */
	public EntregasQueueDTO(String xmlSource) {
		this.initializeFromXML(xmlSource);
	}

	public EntregasQueueDTO(boolean forHistory) {
		if (forHistory)
			_persistPath = MainKeys.FILE_PATH_HISTORIAL_ENTREGAS;
		else
			_persistPath = MainKeys.FILE_PATH_ENTREGAS;
	}

	public void initializeFromXML(String xmlSource) {
		XMLHandler xml = new XMLHandler(xmlSource);

		xml = new XMLHandler(xml.getElementValue(XML_ELEMENT_ROOT_TAG));
		this._persistPath = xml.getElementValue(XML_ELEMENT_PERSIST_PATH);
		this._lastOverwrite = DateUtil.getFromString(xml
				.getElementValue(XML_ELEMENT_LAST_OVERWRITE),
				DateUtil.DATE_SEPARATOR_BAR);

		xml = new XMLHandler(xml.getElementValue(XML_ELEMENT_ELEMENTS));

		int elementsCount = xml.getElementCount();

		int idx = 0;
		for (idx = 0; idx < elementsCount; idx++) {
			EntregasQueueElementDTO anElement = new EntregasQueueElementDTO(xml
					.getFirstElementValueOverIteration(), true);
			_entregas.put(anElement.getLegajoAyudante(), anElement);
		}

		return;
	}

	public String toXMLString() {
		XMLHandler xml = new XMLHandler(XML_ELEMENT_ROOT_TAG, null, null);
		xml.addElementAtRoot(XML_ELEMENT_PERSIST_PATH, null, _persistPath);
		xml.addElementAtRoot(XML_ELEMENT_LAST_OVERWRITE, null, DateUtil
				.exportDateAs(_lastOverwrite != null ? _lastOverwrite
						: Calendar.getInstance().getTime(),
						DateUtil.DATE_ORDER_DD_MM_AAAA,
						DateUtil.DATE_SEPARATOR_BAR));

		XMLHandler xmlElements = new XMLHandler(XML_ELEMENT_ELEMENTS, null,
				null);
		Enumeration elements = _entregas.elements();
		while (elements.hasMoreElements()) {
			EntregasQueueElementDTO unElemento = (EntregasQueueElementDTO) elements
					.nextElement();

			xmlElements.addElementAtRoot(unElemento.toXMLString());
		}
		xml.addElementAtRoot(xmlElements.toXMLString());

		return MainKeys.XML_VERSION_TAG + xml.toXMLString();
	}

	/**
	 * @param entregas
	 *            Un {@link Vector} de {@link EntregaDTO}.
	 * @param legajoAyudante
	 */
	// TODO : Javadoc : Terminate this Javadoc.
	public void addAll(Vector entregas, String legajoAyudante) {
		Enumeration elements = entregas.elements();
		for (int idx = 1; elements.hasMoreElements(); idx++) {
			EntregaDTO unaEntrega = (EntregaDTO) elements.nextElement();

			this.add(unaEntrega, legajoAyudante);
		}
	}

	/**
	 * @param unaEntrega
	 * @param legajoAyudante
	 */
	// TODO : Javadoc : Terminate this Javadoc.
	public void add(EntregaDTO unaEntrega, String legajoAyudante) {// TODO :
																	// Test:
																	// addEntrega
																	// entregasqueue
		EntregasQueueElementDTO anElement = (EntregasQueueElementDTO) this._entregas
				.get(legajoAyudante);

		// Como ya existen entregas pendientes para ese legajo, entonces solo
		// agrego una nueva.
		if (anElement != null) {
			anElement.addEntrega(unaEntrega);
			return;
		}

		// Como NO existen tal legajo, creo un EntregasQueueElementDTO nuevo.
		Vector entregas = new Vector();
		entregas.addElement(unaEntrega);

		anElement = new EntregasQueueElementDTO(legajoAyudante);
		anElement.set_entregas(entregas);

		this._entregas.put(legajoAyudante, anElement);
	}

	public String getPersistPath() {
		return this._persistPath;
	}

	public String getStringToPersist() {
		return this.toXMLString();
	}

	/**
	 * @param legajo
	 * @return
	 */
	public Vector getEntregas(String legajo) {
		EntregasQueueElementDTO queueElement = (EntregasQueueElementDTO) this._entregas
				.get(legajo);
		if (queueElement != null)
			return queueElement.get_entregas();
		return new Vector();
	}

	public boolean hasPendingEntregas(String legajo) {
		EntregasQueueElementDTO anElement = (EntregasQueueElementDTO) _entregas
				.get(legajo);

		return anElement != null;
	}

	public void resetEntregas(String legajo) {
		this._entregas.remove(legajo);
	}

	public Date getLastOverwrite() {
		return this._lastOverwrite;
	}

}
